using UnityEngine;
using System.Collections;
using System;

namespace CFE
{
    public class Buildings : Base{
        private int MoneyNeeded, WoodNeeded;//Ресурсы необходимые для постройки здания
        public int BuildingType;//названиe здания		
		public string s_Race;//Раса
		private int unitType;//Тип производимого юнита
        private float ProducingTime;//Время производства (константа)
		public float Producing_timer;//Время производства 
		private Mesh mesh;//наш внешний вид
		private Color color;//наш цветы
		
		void Awake()
		{
			initialize(s_Race,BuildingType,Aliance);
			
		}
		
		//Инициализация объекта
		public void initialize(string _Race,int building_type,int _Aliance)
		{
			var build_base=gameObject.GetComponent<Base>();
			build_base.Aliance=_Aliance;
			build_base.IsBuilding=true;
			int _MaxHP=0,_Arm=0;
			Race race;
			BuildingType=building_type;

			//Идентификация рассы и класса, задание характеристик
			race=(Race)Enum.Parse(typeof(Race),_Race);
			
			if(race.Equals(Race.Humans))//Люди
			{
				switch(BuildingType)
				{
				case 1://Крестьянин
					_MaxHP=1300;
					_Arm=8;
					unitType=1;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(1, 0f, 0f),
                        new Vector3(1, 1, 0f),
                        new Vector3(0f, 1, 0f)});
					color=Color.red;
					break;
				case 2://Адепт
					_MaxHP=1300;
					_Arm=8;
					unitType=2;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(2, 0f, 0f),
                        new Vector3(2, 2, 0f),
                        new Vector3(0f, 2, 0f)});
					color=Color.red;
					break;
				case 3://Мечник
					_MaxHP=1300;
					_Arm=8;
					unitType=3;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(3, 0f, 0f),
                        new Vector3(3, 3, 0f),
                        new Vector3(0f, 3, 0f)});
					color=Color.red;
					break;		
				}
			}
			else if(race.Equals(Race.Orks))//Орки
			{
				switch(BuildingType)
				{
				case 1://Всадник
					_MaxHP=1300;
					_Arm=8;
					unitType=1;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(1, 0f, 0f),
                        new Vector3(1, 1, 0f),
                        new Vector3(0f, 1, 0f)});
					color=Color.green;
					break;
				case 2://Троль
					_MaxHP=1300;
					_Arm=8;
					unitType=2;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(2, 0f, 0f),
                        new Vector3(2, 2, 0f),
                        new Vector3(0f, 2, 0f)});
					color=Color.green;
					break;
				case 3://Орк
					_MaxHP=1300;
					_Arm=8;
					unitType=3;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(3, 0f, 0f),
                        new Vector3(3, 3, 0f),
                        new Vector3(0f, 3, 0f)});
					color=Color.green;
					break;		
				}
			}
			else if(race.Equals(Race.Elfs))//Эльфы
			{
				switch(BuildingType)
				{
				case 1://Энт
					_MaxHP=1300;
					_Arm=8;
					unitType=1;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(1, 0f, 0f),
                        new Vector3(1, 1, 0f),
                        new Vector3(0f, 1, 0f)});
					color=Color.blue;
					break;
				case 2://Тигр
					_MaxHP=1300;
					_Arm=8;
					unitType=2;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(2, 0f, 0f),
                        new Vector3(2, 2, 0f),
                        new Vector3(0f, 2, 0f)});
					color=Color.blue;
					break;
				case 3://Лучник
					_MaxHP=1300;
					_Arm=8;
					unitType=3;
					ProducingTime=7;
					mesh=CreateMesh(0,new Vector3[4] {
                        Vector3.zero,
                        new Vector3(3, 0f, 0f),
                        new Vector3(3, 3, 0f),
                        new Vector3(0f, 3, 0f)});
					color=Color.blue;
					break;		
				}
			}
			//Инициализация полей
			Base temp_base=gameObject.GetComponent<Base>();
			temp_base.initialize(_MaxHP,_Arm);
			Pos=transform;
			Producing_timer=0;
		}
		void FixedUpdate()
		{
			Producing();			
		}
			
		public void Producing()
		{
			if(Producing_timer>0) Producing_timer-=Time.deltaTime;
			if(Producing_timer<0) Producing_timer=0;
			if(Producing_timer==0)
			{
				GameObject orijinal=new GameObject();//создаём объект для нашего юнита
				orijinal.transform.position=Pos.position;//задаём ему начальную позицию
				orijinal.AddComponent<Base>().Aliance=Aliance;//оперделяем фракцию
				orijinal.AddComponent<Units>();//добавляем специфику юнита
				orijinal.AddComponent<Kreep>().initialize(s_Race,unitType);//инициализируем				
				orijinal.AddComponent<MeshFilter>().mesh=mesh;//добавляем оболочку
				orijinal.AddComponent<MeshRenderer>().material.color=color;//задаём цвет
				Producing_timer=ProducingTime;//задаём таймер
			}
		}
		
        public void Upgrade(string _BuildingType)
        {
			//--
        }
		
		private Mesh CreateMesh(int startIndex,Vector3[] points) 
		{
			Mesh m =new Mesh();        
	        // Полностью очищаем Mesh, удаляем все предыдущие вершины
	        m.Clear();
	
	        // Создаем массивы, в которых будут располагаться наши новые вершины,
	        // треугольники и UV-координаты
	        Vector3[] vertices = new Vector3[6];
	        int[] triangles    = new int[6];
	        Vector2[] uv       = new Vector2[6];
	
	        // Вся "магия" происходит в методе CreatePlane
	        CreatePlane(startIndex, ref vertices, ref triangles, ref uv, points);
	               
	
	        // Все! Массивы векторов готовы, можем записать их обратно в Mesh
	        m.vertices = vertices;
	        m.uv = uv;
	        m.triangles= triangles;
			return m;
		}
		/**
 * Отрисовка плоскости, заданной четырьмя точками по часовой или против часовой стрелки
 */
	private void CreatePlane(int startIndex, ref Vector3[] vertices, ref int[] triangles, ref Vector2[] uv, Vector3[] points)
	{
        // Как мы знаем, плоскость состоит из двух треугольников:

        // - Первый треугольник
        vertices[startIndex + 0] = points[0];
        vertices[startIndex + 1] = points[1];
        vertices[startIndex + 2] = points[2];
        triangles[startIndex + 0] = startIndex +0;
        triangles[startIndex + 1] = startIndex +1;
        triangles[startIndex + 2] = startIndex +2;
        uv[startIndex + 0] = new Vector2(0,0);
        uv[startIndex + 1] = new Vector2(0,1);
        uv[startIndex + 2] = new Vector2(1,1);
        
                
        // - Второй треугольник
        vertices[startIndex + 3] = points[0];
        vertices[startIndex + 4] = points[2];
        vertices[startIndex + 5] = points[3];
        triangles[startIndex + 3] = startIndex +3;
        triangles[startIndex + 4] = startIndex +4;
        triangles[startIndex + 5] = startIndex +5;
        uv[startIndex + 3] = new Vector2(0,0);
        uv[startIndex + 4] = new Vector2(1,1);
        uv[startIndex + 5] = new Vector2(1,0);
	}

    }    
}
